
#ifndef SLIDER_COMPONENT_H
#define SLIDER_COMPONENT_H

#ifdef __cplusplus
extern "C" {
#endif

#include "lvgl/lvgl.h"
#include <SDL2/SDL.h>

// slider事件监听枚举类型
enum slider_event_observer_type {
    touch_down_pressed,// LV_EVENT_PRESSED 用户刚按下滑块时触发回调函数（开始拖动）
    pressing,// LV_EVENT_PRESSING 只要用户按着坏块即使值没变化也会持续触发回调函数
    touchup_released,// LV_EVENT_RELEASED 用户刚松开滑块时触发回调函数（拖动结束）
    value_changed// LV_EVENT_VALUE_CHANGED 只有slider的值发生变化时才会触发回调函数，一般拖动过程值都会发生变化都会触发，按着不拖动情况值没变化不会触发
};

/**
 * 设置slider是否可用
 *
 * @param slider 进度条
 * @param enable slider是否可用，false：滑块会变灰，无法响应用户事件（拖动、点击等），程序仍可通过 lv_slider_set_value() 修改其值。
 * @return
 */
void config_enable_slider(lv_obj_t *slider, _Bool enable);

/**
 * 给slider添加事件监听回调方法
 * @param slider 进度条
 * @param event_cb 回调方法
 * @param filter 监听事件类型
 * @param user_data 自定义回调方法数据
 * @return
 */
void add_slider_event_observer(lv_obj_t *slider,
                              lv_event_cb_t event_cb,
                              enum slider_event_observer_type event_observer_type,
                              void *user_data);
/**
 * 给slider添加拖拽过程回调方法，拖动过程中不断触发
 * @param slider 进度条
 * @param event_cb 回调方法
 * @param filter 事件类型
 * @param user_data 自定义回调方法数据
 * @return
 */
void draging_observer(lv_obj_t *slider,
                    lv_event_cb_t event_cb,
                    lv_event_code_t filter,
                    void *user_data);

/**
 * 是否正在拖拽slider滑块
 * @param slider 进度条
 * @return _Bool 是否正在拖拽slider滑块
 */
_Bool is_draging(lv_obj_t *slider);

/**
 * 给slider和label设置进度
 * @param slider 进度条
 * @param label 进度标签
 * @param gone_count 已完成数量
 * @param total_count 总数量
 * @return _Bool 是否正在拖拽slider滑块
 */
void config_slider_progress(lv_obj_t *slider,
                          lv_obj_t *label,
                          Uint32 gone_count,
                          Uint32 total_count);
#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* SLIDER_COMPONENT_H */
